'''
多模态图像对比分析示例

核心功能：使用视觉语言模型进行图像相似性分析和对比

应用场景：
- 图像相似度检测
- 产品对比分析
- 内容重复检测
- 视觉差异识别
'''
import os

from dotenv import load_dotenv
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI

# 自动加载 .env 文件中的环境变量
load_dotenv()

# ========== 初始化视觉语言模型 ==========
'''
视觉语言模型（Vision-Language Model）特点：
- 能够同时理解和处理图像与文本
- 支持多张图像输入并进行对比分析
- 可以理解图像间的相似性和差异性
'''
llm = ChatOpenAI(api_key=os.getenv("MODELSCOPE_API_KEY"), openai_api_base=os.getenv("MODELSCOPE_API_BASE"), model="Qwen/Qwen2.5-VL-72B-Instruct", streaming=True, temperature=0)
# ========== 图像数据准备 ==========
'''
图像URL说明：
- 使用公开可访问的网络图片
- 支持多种图片格式（JPEG、PNG、WebP等）
- 图片大小和分辨率会影响处理速度
'''
# 在线图片地址
image_url_1 = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimage109.360doc.com%2FDownloadImg%2F2025%2F04%2F0321%2F296122601_4_20250403090445718&refer=http%3A%2F%2Fimage109.360doc.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1762504985&t=8090aac3171f1a36b1433b4888b8722f"
image_url_2 = "https://sns-img-hw.xhscdn.com/1000g0082316h6uafc06g5ocbpdb8cmtf915cdqg?imageView2/2/w/1080/format/webp"

print("🖼️ 使用的图像URL:")
print(f"   图像1: {image_url_1}")
print(f"   图像2: {image_url_2}")

# ========== 多模态消息格式说明 ==========
'''
HumanMessage 内容格式规范：

固定写法：
{
    "type": "text",           # 文本类型
    "text": "文本内容"        # 具体的文本指令
}

{
    "type": "image_url",      # 图像类型
    "image_url": {
        "url": "图片URL地址"  # 图片的URL或base64数据
    }
}

官方文档参考：https://python.langchain.com/docs/how_to/

支持的 content 类型：
- "text":       普通文本输入
- "image_url":  在线图片或base64图片
- 其他类型：    取决于模型支持能力

多图片示例：
content = [
    {"type": "text", "text": "指令"},
    {"type": "image_url", "image_url": {"url": "url1"}},
    {"type": "image_url", "image_url": {"url": "url2"}}
]

Base64图片格式：
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}
'''

# ========== 构建图像对比消息 ==========
'''
消息设计策略：
1. 文本指令：明确告诉模型要执行的任务
2. 多图像输入：按顺序提供需要对比的图像
3. 结构化格式：确保模型能正确解析每个内容块
'''
message = HumanMessage(
    content=[
        # 文本指令：明确的任务描述
        {"type": "text", "text": "这两种图片是一样的吗？请详细分析它们的相似性和差异性。"},

        # 第一张图片
        {"type": "image_url", "image_url": {"url": image_url_1}},

        # 第二张图片
        {"type": "image_url", "image_url": {"url": image_url_2}}

        # 备用方案：如果图片URL访问不到，可以使用base64格式
        # {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_data}"}}
    ],
)

print("\n📨 构建的多模态对比消息:")
print(f"   文本指令: {message.content[0]['text']}")
print(f"   图像数量: {len([item for item in message.content if item['type'] == 'image_url'])}")
print(f"   消息类型: HumanMessage")

# ========== 调用模型进行图像对比分析 ==========
print("\n🚀 开始调用视觉语言模型进行图像对比...")
print("⏳ 模型正在分析图像内容，请稍候...")

try:
    response = llm.invoke([message])

    print("✅ 模型响应接收完成!")
    print("\n📊 图像对比分析结果:")
    print("=" * 50)
    print(response.content)
    print("=" * 50)

except Exception as e:
    print(f"❌ 模型调用失败: {e}")


# ========== 进阶功能：图像对比分析工具 ==========
def demonstrate_advanced_comparison():
    """
    演示高级图像对比分析功能
    """
    print("\n" + "=" * 60)
    print("🔬 高级图像对比分析功能")
    print("=" * 60)

    # 不同的对比分析提示词
    comparison_prompts = [
        {
            "name": "相似度分析",
            "prompt": "分析这两张图片的相似度，给出相似度百分比并说明理由",
            "use_case": "内容去重、版权检测"
        },
        {
            "name": "差异检测",
            "prompt": "找出这两张图片的主要差异，按重要性排序",
            "use_case": "质量检测、版本对比"
        },
        {
            "name": "场景理解",
            "prompt": "分析两张图片分别是什么场景，有什么关联",
            "use_case": "场景分析、内容理解"
        },
        {
            "name": "风格对比",
            "prompt": "对比两张图片的视觉风格、色彩和构图",
            "use_case": "设计分析、艺术研究"
        }
    ]

    print("\n🎯 可用的对比分析类型:")
    for scenario in comparison_prompts:
        print(f"   📖 {scenario['name']}:")
        print(f"      提示词: {scenario['prompt']}")
        print(f"      应用场景: {scenario['use_case']}")


# ========== 图像处理最佳实践 ==========
def demonstrate_best_practices():
    """
    演示图像处理的最佳实践
    """
    print("\n" + "=" * 60)
    print("💡 图像处理最佳实践")
    print("=" * 60)

    print("\n🖼️ 图像输入优化:")
    print("   1. ✅ 使用公开可访问的图片URL")
    print("   2. ✅ 确保图片格式受支持（JPEG、PNG、WebP）")
    print("   3. ✅ 控制图片大小（建议 < 10MB）")
    print("   4. ✅ 提供清晰的文本指令")

    print("\n🔧 故障排除方案:")
    print("   1. 🔄 URL访问失败 → 使用base64编码")
    print("   2. 🔄 图片太大 → 压缩或裁剪")
    print("   3. 🔄 模型无响应 → 检查网络和API密钥")
    print("   4. 🔄 解析错误 → 验证消息格式")

    print("\n🎯 提示词优化技巧:")
    print("   1. ✨ 明确指定对比维度（颜色、内容、风格等）")
    print("   2. ✨ 要求结构化输出（相似度百分比、差异列表等）")
    print("   3. ✨ 指定详细程度（简要对比/详细分析）")
    print("   4. ✨ 限制输出长度（避免过于冗长）")


# ========== 实际业务应用场景 ==========
def demonstrate_business_use_cases():
    """
    演示实际业务中的应用场景
    """
    print("\n" + "=" * 60)
    print("🏢 实际业务应用场景")
    print("=" * 60)

    business_scenarios = [
        {
            "name": "电商产品对比",
            "description": "比较不同商家的同一款产品图片",
            "prompt": "这两张产品图片展示的是同一款商品吗？请从产品外观、颜色、细节等方面对比",
            "value": "防止虚假宣传、确保产品一致性"
        },
        {
            "name": "内容审核",
            "description": "检测用户上传图片是否与违规内容相似",
            "prompt": "分析这张图片是否包含违规内容，与参考图片对比相似度",
            "value": "自动化内容审核、提高审核效率"
        },
        {
            "name": "设计评审",
            "description": "对比设计稿的不同版本",
            "prompt": "对比这两个设计版本的差异，列出所有修改点",
            "value": "设计版本管理、变更追踪"
        },
        {
            "name": "医学影像",
            "description": "对比同一患者不同时间的医学影像",
            "prompt": "分析这两张医学影像的差异，指出可能的变化",
            "value": "病情监测、治疗效果评估"
        }
    ]

    print("\n💼 业务应用示例:")
    for scenario in business_scenarios:
        print(f"   🏷️  {scenario['name']}:")
        print(f"      描述: {scenario['description']}")
        print(f"      提示词: {scenario['prompt']}")
        print(f"      业务价值: {scenario['value']}")
        print()


# ========== 扩展功能：批量图像对比 ==========
def batch_image_comparison_demo():
    """
    演示批量图像对比功能
    """
    print("\n" + "=" * 60)
    print("📦 批量图像对比演示")
    print("=" * 60)

    # 模拟批量对比场景
    comparison_pairs = [
        {"name": "产品A vs 产品B", "url1": image_url_1, "url2": image_url_2},
        {"name": "设计稿v1 vs v2", "url1": image_url_1, "url2": image_url_2},
        {"name": "前后对比", "url1": image_url_1, "url2": image_url_2}
    ]

    print("🔄 批量对比流程:")
    print("   1. 准备对比图像对")
    print("   2. 构建对比消息")
    print("   3. 调用模型分析")
    print("   4. 汇总对比结果")
    print("   5. 生成对比报告")

    print(f"\n📊 可批量处理 {len(comparison_pairs)} 个图像对")


# 运行进阶演示
demonstrate_advanced_comparison()
demonstrate_best_practices()
demonstrate_business_use_cases()
batch_image_comparison_demo()

print("\n" + "=" * 60)
print("🎉 图像对比分析演示完成!")
print("=" * 60)
print("💡 核心技术总结:")
print("   1. 🌟 多模态模型支持图像和文本联合理解")
print("   2. 🔄 标准化的消息格式确保兼容性")
print("   3. 🖼️  支持多张图像同时输入和对比")
print("   4. 📊 灵活的对比维度和分析角度")
print("   5. 🏢 广泛的业务应用场景")